package com.day16;

/**
 * 演示死锁的流程:
 *
 * 1.死锁的理解: 不同的线程分别占用对方需要的同步资源部放弃，都在等待对方放弃自己需要的同步资源，这种情况称为死锁。
 *
 *
 *
 * 2.说明:
 *  1.出现死锁后，不会出现异常，不会出现提示，只是所有的线程都处于阻塞状态，无法继续。
 *  2.我们使用同步时，要避免死锁。
 */
public class ThreadTest {

    public static void main(String[] args) {

        StringBuffer stringBuffer = new StringBuffer();
        StringBuffer stringBuffer1 = new StringBuffer();



        new Thread(){
            public void run(){

                synchronized(stringBuffer){
                    stringBuffer.append("a");
                    stringBuffer1.append("1");

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (stringBuffer1){
                        stringBuffer.append("b");
                        stringBuffer1.append("2");

                        System.out.println(stringBuffer);
                        System.out.println(stringBuffer1);
                    }

                }

            }
        }.start();



        new Thread(()->{
            synchronized(stringBuffer){
                stringBuffer.append("c");
                stringBuffer1.append("3");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (stringBuffer1){
                    stringBuffer.append("d");
                    stringBuffer1.append("4");

                    System.out.println(stringBuffer);
                    System.out.println(stringBuffer1);
                }
            }

        }).start();
    }
}
